/**
 * 格式化数字变为每3位加一个逗号
 * @param num
 * @returns {string}
 */
export const formatNumberAsPrice = function (num) {
  // 如果数字带有小数点的话，可以使用toLocaleString()方法实现这个需求。
  // 没有小数点，就用正则匹配实现。
  return (num.toString().indexOf('.') !== -1) ? num.toLocaleString() : num.toString().replace(/(\d)(?=(?:\d{3})+$)/g,
    '$1,')
}

/**
 * 随机数
 * @param {Object} Min
 * @param {Object} Max
 * @param {Object} sacle 随机数间隔
 */
export function RandomNum (Min, Max, sacle = 1) {
  var Range = Max - Min

  var Rand = Math.random()

  var num = Min + Math.floor(Rand * Range) * sacle // 舍去

  return num
}

/**
 * 节流函数
 */
export function Throttle (fn, t) {
  let last
  let timer
  const interval = t || 500
  return function () {
    const args = arguments
    const now = +new Date()
    if (last && now - last < interval) {
      clearTimeout(timer)
      timer = setTimeout(() => {
        last = now
        fn.apply(this, args)
      }, interval)
    } else {
      last = now
      fn.apply(this, args)
    }
  }
}

/**
 * 获取浏览器参数
 * @param name
 * @returns {*}
 * @constructor
 */
export function getQueryString (name) {
  const reg = new RegExp('(^|&)' + name + '=([^&]*)(&|$)')
  const r = window.location.search.substr(1).match(reg) // search,查询？后面的参数，并匹配正则
  if (r != null) return decodeURIComponent(r[2])
  return null
}

/**
 * 从多少分改为多少元 1234->12.34
 */
export function changePriceFromFen (val, n = 2) {
  if (!val) {
    return 0.00
  }
  try {
    const number = Number.parseFloat(val)
    return keepN(number / 100, n)
  } catch (e) {
    return 0
  }
}

/**
 * 保留n位小数，精确后, 防止float出现1.39999的情况
 */
export function keepN (val, n = 2) {
  if (val === null || val === '') {
    return ''
  }
  const num = Number.parseFloat(val)
  return Number.parseFloat(num.toPrecision(12)).toFixed(n)
}

export function getTimeString (val, n = 16) {
  if (!val || val === '') {
    return ''
  }

  return val.substring(0, n)
}

/**
 * 脱敏处理名字
 * 一个字的名字：显示一个字加星号。例：虎 -> 虎*
 * 两个字的名字：显示第一个字加星号。例：老虎 -> 老*
 * 三个字的名字：显示第一个字和最后一个字。例如：大老虎 -> 大*虎
 */
export function blurName (name) {
  if (!name) {
    return name
  }
  const length = name.length
  // 1
  if (length === 1) {
    return name + '*'
  }
  if (length === 2) {
    return name.substring(0, 1) + '*'
  }
  if (length > 2) {
    return name.substring(0, 1) + '**' + name.substring(length - 1)
  }
}

/**
 * 得到时间戳,需要注意替换-为/，因为IOS是只支持后者
 * */
export function getTimestamp (date) {
  if (!date) {
    return
  }
  date = date.substring(0, 19)
  // 为了ios需要替换
  date = date.replace(/-/g, '/')
  return new Date(date).getTime()
}

/**
 * hash name的值，从list取出对应的值
 * 目前使用的是获取name的unicode总和，然后取list长度的模；
 * @code{
 *      let list = ['至尊人气达人', '人气杠杠的', '我是人气王'];
 *      let name = '我们';
 *      let unicode = 31934 + 23192;
 *      hash = 50023 % 3;
 * }
 * @param name
 * @param list
 * @returns {string}
 */
export function hashFormString (name, list) {
  // 按名字unicode总和取称号
  const unicode = name.split('').reduce((total, item) => {
    return total + item.charCodeAt(0)
  }, 1)
  return list[unicode % list.length]
}

/**
 * @param {Object} date
 * 传入时间-当前时间,fix当前时间与服务器时间差
 * @param num
 */
export function isExpiration (date, num = 0) {
  if (!date) {
    return false
  }
  const date1 = new Date().getTime()
  const date2 = new Date(date.replace(/-/g, '/')).getTime() + num * 24 * 3600 * 1000
  const temp = date2 - date1
  return temp <= 0
}

export function getTimeFormat (timestamp) {
  var date = new Date(timestamp)
  let month = (date.getMonth() + 1)
  if (month < 10) {
    month = '0' + month
  }
  let day = date.getDate()
  if (day < 10) {
    day = '0' + day
  }
  let hour = date.getHours()
  if (hour < 10) {
    hour = '0' + hour
  }
  let minute = date.getMinutes()
  if (minute < 10) {
    minute = '0' + minute
  }
  let second = date.getSeconds()
  if (second < 10) {
    second = '0' + second
  }
  return date.getFullYear() + '-' + month + '-' + day + ' ' + hour + ':' + minute + ':' + second
}

export function funDate (num = 0) {
  const date1 = new Date()
  const date2 = new Date(date1)
  date2.setDate(date1.getDate() + num)
  let month = (date2.getMonth() + 1)
  if (month < 10) {
    month = '0' + month
  }
  let day = date2.getDate()
  if (day < 10) {
    day = '0' + day
  }
  return date2.getFullYear() + '-' + month + '-' + day + ' 00:00:00'
}

/**
 * px转rem
 * 750 为px的设计
 *
 */
export function pxToRem (num) {
  if (!num) {
    return 0
  }
  const px = Number.parseInt(num, 10)
  // 获取浏览器宽度
  const width = document.documentElement.clientWidth
  // 计算根节点大小
  const fontSize = width / 3.75
  // 换算传入的大小
  return px / fontSize
}

/**
 * px转rem
 * 750 为px的设计
 *
 */
export function pxToRemString (num) {
  return pxToRem(num) + 'rem'
}

export function resetInputIOS () {
  window.scrollBy(0, -1)
  setTimeout(() => {
    window.scrollBy(0, 1)
  }, 10)
}

export function getTimeDiff (time) {
  if (!time) {
    return
  }
  // 转换时间格式
  const tempTime = time.replace(/-/g, '/')
  const timeDiff = new Date().getTime() - new Date(tempTime).getTime()
  // 计算相差天数
  return timeDiff / (24 * 3600 * 1000)
}

export function ifExist (num) {
  return num || 0
}

export function ifStringExist (text) {
  return text || ''
}

/**
 *
 */
export function safeSubstring (str, firstIndex, lastIndex, defaultString = '') {
  try {
    return str.substring(firstIndex, lastIndex)
  } catch (e) {
    console.warn('safeSubstring：', e)
    return str
  }
}

/**
 * 统计某个字符出现的次数
 * @param {Object} str
 * @param {Object} strCheck
 */
export function getStrNum (str, strCheck) {
  let index = str.indexOf(strCheck) // 字符出现的位置
  let num = 0 // 这个字符出现的次数
  while (index !== -1) {
    console.log(index) // 打印字符串出现的位置
    num++ // 每出现一次 次数加一
    index = str.indexOf(strCheck, index + 1) // 从字符串出现的位置的下一位置开始继续查找
  }
  return num
}

export function isBlank (obj) {
  if (!obj) {
    return true
  }
  if (typeof obj === 'string') {
    // 去除空格串
    return obj.trim().length === 0
  } else if (typeof obj === 'object') {
    if (obj instanceof Array) {
      // 去除空数组
      return obj.length === 0
    }
  }
  return false
}

export function setDefaultValue (res, defalutRes) {
  for (const key in defalutRes) {
    if (res[key] == null) {
      res[key] = defalutRes[key]
    }
  }
  return res
}

/**
 * 安全的JSON转成数组
 */
export function safeToArray (str) {
  try {
    return JSON.parse(str)
  } catch (err) {
    // console.warn('safeToArray：', err)
    return []
  }
}

/**
 * 补零
 */
function keep2 (number) {
  return number < 10 ? '0' + number : number
}

/**
 * 安全的转换成时间
 * @param {Object} str
 */
function safeToDate (str) {
  if (!str) {
    return ''
  }
  // 为了ios需要替换
  str = str.replace(/-/g, '/')
  return new Date(str)
}

/**
 * 格式化日期时间
 * 将日期时间转换为指定格式，如：YYYY-mm-dd HH:MM表示2019-06-06 19:45
 * @param {Object} fmt
 * @param {Object} date
 */
function dateFormat (fmt, date) {
  let ret
  const opt = {
    'Y+': date.getFullYear().toString(), // 年
    'm+': (date.getMonth() + 1).toString(), // 月
    'd+': date.getDate().toString(), // 日
    'H+': date.getHours().toString(), // 时
    'M+': date.getMinutes().toString(), // 分
    'S+': date.getSeconds().toString() // 秒
    // 有其他格式化字符需求可以继续添加，必须转化成字符串
  }
  for (const k in opt) {
    ret = new RegExp('(' + k + ')').exec(fmt)
    if (ret) {
      fmt = fmt.replace(ret[1], (ret[1].length === 1) ? (opt[k]) : (opt[k].padStart(ret[1].length, '0')))
    }
  }

  return fmt
}

/**
 * 转换成中文index
 */
export function toChineseIndex (index) {
  const r = '一二三四五六七八九十'.split('')
  return r[index]
}

export default {
  Throttle,
  getQueryString,
  changePriceFromFen,
  blurName,
  keepN,
  keep2,
  getTimestamp,
  hashFormString,
  isExpiration,
  pxToRem,
  pxToRemString,
  resetInputIOS,
  ifExist,
  ifStringExist,
  safeSubstring,
  getTimeString,
  isBlank,
  getTimeFormat,
  funDate,
  /**
   * 设置默认值，用default替换res里面不存在的数据
   */
  setDefaultValue,
  safeToArray,
  dateFormat,
  safeToDate,
  getStrNum,
  RandomNum,
  toChineseIndex

}
